const encrypt = require('../utils/encrypt')

const User = require('../Models/user')

// 注册
exports.reg = async ctx => {
  // 用户注册时 post 发来的数据
  const user = ctx.request.body
  const username = user.username
  const password = user.password
  // 注册时 以下操作假设 格式符合
  // 1. 去数据库查询 username 是否存在
  await new Promise((resolve, reject) => {
    // 去users数据库查询
    User.find({username}, (err, data) => {
      if(err) return reject(err)
      // 用户已存在
      if(data.length) return resolve("")
      // 用户名不存在  保存到数据库
      const _user = new User({
        username,
        password: encrypt(password),
        articleNum: 0,
        commentNum: 0
      })
      
      _user.save((err, data) => {
        if(err) {
          reject(err)
        } else {
          resolve(data)
        }
      })
    })
  })
  .then(async data => {
    if(!data) {
      // 用户名已存在
      await ctx.render("isOk", {
        status: "注册失败，用户名已存在"
      })
    } else {
      // 注册成功
      await ctx.render("isOk", {
        status: "注册成功"
      })
    }
  })
  .catch(async err => {
    await ctx.render("isOk", {
      status: "注册失败， 请重试"
    })
  })
}
// 登录
exports.login = async ctx => {
  const user = ctx.request.body
  const username = user.username
  const password = user.password

  await new Promise((resolve, reject) => {
    User.find({username}, (err, data) => {
      if(err) return reject(err)
      if(data.length === 0) return reject("用户名不存在")

      // 把用户传过来的密码 加密后和数据库中的密码比对
      if(data[0].password === encrypt(password)) {
        return resolve(data)
      }

      resolve("")
    })
  })
  .then(async data => {
    if(!data) {
      return ctx.render('isOk', {
        status: '密码不正确，登录失败'
      })
    }

    // 让用户在cookie里设置 username password（加密）
    ctx.cookies.set("username", username, {
      domain: "localhost",
      path: "/",
      maxAge: 36e5,
      httpOnly: true, // 不让客户端访问cookie
      overwrite: false // 不能被覆盖
      // signed: true // 默认为true
    })
    // 保存用户 在数据库的 _id 
    ctx.cookies.set("uid", data[0]._id, {
      domain: "localhost",
      path: "/",
      maxAge: 36e5,
      httpOnly: true, // 不让客户端访问cookie
      overwrite: false // 不能被覆盖
    })
    // 保存用户头像
    ctx.cookies.set("avatar", data[0].avatar, {
      domain: "localhost",
      path: "/",
      maxAge: 36e5,
      httpOnly: true, // 不让客户端访问cookie
      overwrite: true // 更换头像时 可被覆盖
    })

    ctx.session = {
      username,
      uid: data[0]._id,
      avatar: data[0].avatar,
      role: data[0].role
    }

    // 登录成功
    await ctx.render('isOk', {
      status: '登录成功'
    })
  })
  .catch(async err => {
    await ctx.render('isOk', {
      status: '登录失败'
    })
  })
}
// 保持  登录状态
exports.keepLog = async (ctx, next) => {
  if(ctx.session.isNew) { // session初始为true 没有登录
    if(ctx.cookies.get("username")) {
      ctx.session = {
        username: ctx.cookies.get("username"),
        uid: ctx.cookies.get("uid"),
        avatar: ctx.cookies.get("avatar")
      }
    }
  }
  await next()
}
// 用户退出中间件
exports.logout = async ctx => {
  ctx.session = null
  ctx.cookies.set("username", null, {
    maxAge: 0
  })
  ctx.cookies.set("uid", null, {
    maxAge: 0
  })
  // 重定向到 首页
  ctx.redirect("/")
}

// admin  用户管理 获取 users
exports.users = async ctx => {
  // { page: '1', limit: '10' }
  let page = parseInt(ctx.query.page) || 1
  let limit = parseInt(ctx.query.limit)
  page --
  

  // 获取 users 列表
  const data = await User
    // 寻找 权限 小于 600 的用户  指定返回的字段
    .find({"role": {$lt: 600}}, "_id role username articleNum commentNum created")
    .sort("-created") // 按照创建日期进行排序
    .skip(page * limit)
    .limit(limit)
    .then(data => data)

    // 用户数量
  const count = await User.countDocuments() - 1
  
  ctx.body = {
    code: 0,
    msg: "请求数据成功",
    count,
    data
  }
}


// 过于复杂故只删除保留账号功能 评论· 与 文章还在
// admin 用户管理 删除user ===> 删user的所有评论  >> 删 user 的所有文章
exports.amputate = async ctx => {
  const _id = ctx.params.id
  let res = {
    state: 1,
    message: "删除用户成功"
  }
  
  await User
    .findById({_id})
    .then(data => data.remove())
    .catch(err => {
      if(err) {
        console.log(err)
        res = {
          state: 0,
          message: "删除用户失败"
        }
      }
    })

  ctx.body = res
}

// 设置 用户头像
exports.setAvatar = async ctx => {
  const _id = ctx.session.uid

  const fileName = "/avatar/" + ctx.req.file.filename

  await User.updateOne({_id}, {$set: {avatar: fileName}}, err => {
    if(err) console.log(err)
  })
  
  ctx.cookies.set("avatar", fileName, {
    domain: "localhost",
    path: "/",
    maxAge: 36e5,
    httpOnly: true, // 不让客户端访问cookie
    overwrite: true // 更换头像时 可被覆盖
  })

  ctx.session.avatar = fileName

  ctx.body = {
    code: 0,
    message: "头像上传成功！"
  }
}

